package com.zenithmind.exam.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.exam.pojo.dto.AnswerSubmitDTO;
import com.zenithmind.exam.pojo.entity.ExamRecord;
import com.zenithmind.exam.pojo.vo.ExamRecordVO;

import java.util.List;
import java.util.Map;

/**
 * 考试记录服务接口
 * 
 * @author ZenithMind
 * @since 2024-07-01
 */
public interface ExamRecordService extends IService<ExamRecord> {

    /**
     * 开始考试
     * 
     * @param examId 考试ID
     * @param userId 用户ID
     * @param userName 用户姓名
     * @param ipAddress IP地址
     * @param userAgent 用户代理
     * @return 考试记录ID
     */
    String startExam(String examId, String userId, String userName, String ipAddress, String userAgent);

    /**
     * 提交答案
     * 
     * @param answerSubmitDTO 答题提交DTO
     * @return 提交结果
     */
    boolean submitAnswers(AnswerSubmitDTO answerSubmitDTO);

    /**
     * 完成考试
     * 
     * @param examRecordId 考试记录ID
     * @return 完成结果
     */
    boolean finishExam(String examRecordId);

    /**
     * 自动提交超时考试
     * 
     * @param examRecordId 考试记录ID
     * @return 提交结果
     */
    boolean autoSubmitTimeoutExam(String examRecordId);

    /**
     * 获取考试记录详情
     * 
     * @param examRecordId 考试记录ID
     * @return 考试记录详情
     */
    ExamRecordVO getExamRecordById(String examRecordId);

    /**
     * 根据考试ID获取考试记录列表
     * 
     * @param examId 考试ID
     * @return 考试记录列表
     */
    List<ExamRecordVO> getExamRecordsByExamId(String examId);

    /**
     * 根据用户ID获取考试记录列表
     * 
     * @param userId 用户ID
     * @return 考试记录列表
     */
    List<ExamRecordVO> getExamRecordsByUserId(String userId);

    /**
     * 分页查询考试记录
     * 
     * @param page 分页参数
     * @param examId 考试ID
     * @param userId 用户ID
     * @param userName 用户姓名
     * @param status 状态
     * @return 分页结果
     */
    IPage<ExamRecordVO> getExamRecordPage(Page<ExamRecord> page, String examId, String userId, 
                                         String userName, Integer status);

    /**
     * 获取考试排行榜
     * 
     * @param examId 考试ID
     * @param limit 限制数量
     * @return 排行榜列表
     */
    List<ExamRecordVO> getExamRanking(String examId, Integer limit);

    /**
     * 重新评分
     * 
     * @param examRecordId 考试记录ID
     * @return 重新评分结果
     */
    boolean rescoreExamRecord(String examRecordId);

    /**
     * 批量重新评分
     * 
     * @param examId 考试ID
     * @return 批量重新评分结果
     */
    boolean batchRescoreExamRecords(String examId);

    /**
     * 删除考试记录
     * 
     * @param examRecordId 考试记录ID
     * @return 删除结果
     */
    boolean deleteExamRecord(String examRecordId);

    /**
     * 批量删除考试记录
     * 
     * @param examRecordIds 考试记录ID列表
     * @return 删除结果
     */
    boolean batchDeleteExamRecords(List<String> examRecordIds);

    /**
     * 检查用户是否已参加考试
     * 
     * @param examId 考试ID
     * @param userId 用户ID
     * @return 是否已参加
     */
    boolean hasUserTakenExam(String examId, String userId);

    /**
     * 获取用户在考试中的记录
     * 
     * @param examId 考试ID
     * @param userId 用户ID
     * @return 考试记录
     */
    ExamRecordVO getUserExamRecord(String examId, String userId);

    /**
     * 处理超时考试
     */
    void handleTimeoutExams();

    /**
     * 统计考试记录数据
     *
     * @param examId 考试ID
     * @return 统计结果
     */
    ExamRecordVO getExamRecordStatistics(String examId);

    /**
     * 获取考试统计信息
     *
     * @param examId 考试ID
     * @return 统计信息Map
     */
    Map<String, Object> getExamStatistics(String examId);

    /**
     * 导出考试记录
     * 
     * @param examId 考试ID
     * @return 考试记录列表
     */
    List<ExamRecordVO> exportExamRecords(String examId);
}
